home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / libs / hobbes3 / mouse.asm < prev    next >
Assembly Source File  |  1992-08-27  |  25KB  |  1,263 lines

  1. include hobbes.inc
  2. include extrn.inc
  3.  
  4.  
  5. Prefix MACRO
  6.       push bp
  7.       mov  bp,sp
  8.       push ds
  9.       push si
  10.       push di
  11.       ENDM
  12.  
  13. Postfix MACRO
  14.       pop  di
  15.       pop  si
  16.       pop  ds
  17.       mov  sp,bp
  18.       pop  bp
  19.       ret
  20.       ENDM
  21.  
  22.  
  23. MOUSE_SAVE_BUFFER  equ 65439
  24.  
  25. THE_DELAY    equ   4
  26.  
  27.  
  28. DATASEG
  29.  
  30. Public _MouseX, _MouseY, _MPresent, _MouseKey
  31. Public _UserDefCurs1,_UserDefCurs2,_UserDefCurs3,_UserDefCurs4
  32. public _MousePage_Offset
  33.  
  34. _MouseX               dw  (?)
  35. _MouseY               dw  (?)
  36. MHHot                 dw  (?)
  37. MVHot                 dw  (?)
  38. MMaskPtr              dw  (?)
  39. MouseVisible          dw  (?)
  40. _MPresent             dw  (?)
  41. _MouseKey             dw  (?)
  42. _MKP                  dw  0
  43. oldinfopos            dw  (?)
  44. _MousePage_Offset     dw     0
  45. inter_ok              dw  0
  46. savedbitmask          db  (?)
  47. savedmapmask          db  (?)
  48. top_clip              dw  (?)
  49. left_clip             dw  (?)
  50. bottom_clip           dw  (?)
  51. _Mouse_Top            dw     (?)
  52. _Mouse_Left            dw     (?)
  53. _Mouse_Right        dw     (?)
  54. _Mouse_Bottom        dw     (?)
  55.  
  56.  
  57. StandardHHot      db 0
  58. StandardVHot      db 0
  59. StandardCurs      db 00111111b
  60.                 db 00011111b
  61.                 db 00001111b
  62.                 db 00011111b
  63.                 db 00111011b
  64.                 db 01110001b
  65.                 db 11100000b
  66.                 db 11000000b
  67.  
  68. UpArrowHHot       db 3
  69. UpArrowVHot       db 0
  70. UpArrowCurs       db 00001000b
  71.                 db 00011100b
  72.                 db 00111110b
  73.                 db 01111111b
  74.                 db 00001000b
  75.                 db 00001000b
  76.                 db 00001000b
  77.                 db 00001000b
  78.  
  79.  
  80. LeftArrowHHot     db 0
  81. LeftArrowVHot     db 3
  82. LeftArrowCurs     db 00001000b
  83.                 db 00001100b
  84.                 db 00001110b
  85.                 db 11111111b
  86.                 db 00001110b
  87.                 db 00001100b
  88.                 db 00001000b
  89.                 db 00000000b
  90.  
  91. CheckMarkHHot     db 2
  92. CheckMarkVHot     db 6
  93. CheckMarkCurs     db 00000000b
  94.                 db 10000000b
  95.                 db 11000000b
  96.                 db 01100000b
  97.                 db 00110011b
  98.                 db 00011110b
  99.                 db 00001100b
  100.                 db 00000000b
  101.  
  102. PointHandHHot     db 2
  103. PointHandVHot     db 0
  104. PointHandCurs     db 00001100b
  105.                 db 00001100b
  106.                 db 00001100b
  107.                 db 10101100b
  108.                 db 11111101b
  109.                 db 11111111b
  110.                 db 11111111b
  111.                 db 01111110b
  112.  
  113. XHHot             db 3
  114. XVHot             db 3
  115. XCurs             db 11000011b
  116.                 db 01100110b
  117.                 db 00111100b
  118.                 db 00011000b
  119.                 db 00111100b
  120.                 db 01100110b
  121.                 db 11000011b
  122.                 db 00000000b
  123.  
  124. PlusHHot          db 3
  125. PlusVHot          db 3
  126. PlusCurs          db 00011000b
  127.                 db 00011000b
  128.                 db 00011000b
  129.                 db 11111111b
  130.                 db 11111111b
  131.                 db 00011000b
  132.                 db 00011000b
  133.                 db 00011000b
  134.  
  135. HourGlassHHot     db 3
  136. HourGlassVHot     db 3
  137. HourGlassCurs     db 11111111b
  138.                 db 01000010b
  139.                 db 00100100b
  140.                 db 00011000b
  141.                 db 00011000b
  142.                 db 00100100b
  143.                 db 01011010b
  144.                 db 11111111b
  145.  
  146. UserDef1HHot      db 0
  147. UserDef1VHot      db 0
  148. _UserDefCurs1     db 00000000b
  149.                 db 00000000b
  150.                 db 00000000b
  151.                 db 00000000b
  152.                 db 00000000b
  153.                 db 00000000b
  154.                 db 00000000b
  155.                 db 00000000b
  156.  
  157. UserDef2HHot      db 0
  158. UserDef2VHot      db 0
  159. _UserDefCurs2     db 00000000b
  160.                 db 00000000b
  161.                 db 00000000b
  162.                 db 00000000b
  163.                 db 00000000b
  164.                 db 00000000b
  165.                 db 00000000b
  166.                 db 00000000b
  167.  
  168. UserDef3HHot      db 0
  169. UserDef3VHot      db 0
  170. _UserDefCurs3     db 00000000b
  171.                 db 00000000b
  172.                 db 00000000b
  173.                 db 00000000b
  174.                 db 00000000b
  175.                 db 00000000b
  176.                 db 00000000b
  177.                 db 00000000b
  178.  
  179. UserDef4HHot      db 0
  180. UserDef4VHot      db 0
  181. _UserDefCurs4     db 00000000b
  182.                 db 00000000b
  183.                 db 00000000b
  184.                 db 00000000b
  185.                 db 00000000b
  186.                 db 00000000b
  187.                 db 00000000b
  188.                 db 00000000b
  189.  
  190.  
  191. .code
  192.  
  193. db "Yffud Ekim"
  194.  
  195.  
  196.       Public _MouseInit
  197. _MouseInit proc
  198. ARG X:word,Y:word,Color:byte
  199.  
  200. ; Prefix
  201.         push     bp
  202.         mov      bp,sp
  203.         push     ds
  204.         push     di
  205.         push     si
  206.  
  207.         mov      ax,@data
  208.         mov      ds,ax
  209.  
  210.         mov        ax,_Display_Offset
  211.         mov        _MousePage_Offset,ax
  212.         xor      ax,ax
  213.         mov      [_mpresent],ax
  214.         mov      [MouseVisible],ax
  215.         int      33h
  216.         cmp      ax,0
  217.         je       @@MouseNotInstalled
  218.         mov      ax,000fh              ; set mickey to pixel ratio
  219.         mov      cx,8
  220.         mov      dx,8
  221.         int      33h
  222.         mov      ax,1
  223.         mov      [_mpresent],ax
  224.  
  225.         mov      ax,0007h              ; Set min/max x,y boundaries
  226.         xor      cx,cx
  227.         mov      dx,_Virtual_Width_Pix
  228.         int      33h
  229.         mov      ax,0008h
  230.         xor      cx,cx
  231.         mov      dx,_Virtual_Height_Pix
  232.         int      33h
  233.  
  234.  
  235.         mov      si,OFFSET MMaskPtr
  236.         mov      ax,OFFSET StandardCurs   ; set mask to mouse
  237.         mov      ds:[si],ax
  238.         mov      al,[StandardHHot]
  239.         xor      ah,ah
  240.         mov      [MHHot],ax
  241.         mov      al,[StandardVHot]
  242.         xor      ah,ah
  243.         mov      [MVHot],ax
  244.  
  245.         mov      cx,[x]                ; set mouse position
  246.         mov      [_MouseX],cx
  247.         mov      dx,[y]
  248.         mov      [_MouseY],dx
  249.         mov      ax,0004h
  250.         int      33h
  251.  
  252.         mov      ax,0a000h             ; set the color of the mouse
  253.         mov      es,ax
  254.         mov      di,MOUSE_SAVE_BUFFER - 4
  255.         mov      ax,0f00h + MAP_MASK
  256.         mov      dx,SC_INDEX
  257.         out      dx,ax
  258.         mov      al,[color]
  259.         mov      es:[di],al
  260.  
  261.         mov      ax,cs                 ; set up the interrupt vector
  262.         mov      es,ax
  263.         mov      dx,OFFSET _MouseCursorDisplay
  264.         mov      ax,000ch
  265.         mov      cx,00101011b
  266.         int      33h
  267.  
  268.         jmp     SHORT @@Postfix
  269. @@MouseNotInstalled:
  270.         xor      ax,ax
  271.  
  272. @@Postfix:
  273.         pop      si
  274.         pop      di
  275.         pop      ds
  276.         pop      bp
  277.         ret
  278. _MouseInit endp
  279.  
  280.  
  281.  
  282.  
  283. ;----------------------------------------------------------------------------
  284. ; void MouseUnInit(void);
  285.  
  286.       Public _MouseUnInit
  287. _MouseUnInit proc
  288.  
  289. ; Prefix
  290.         push     bp
  291.         mov      bp,sp
  292.         push     ds
  293.         push     di
  294.         push     si
  295.  
  296.         mov      ax,@data
  297.         mov      ds,ax
  298.  
  299.         cmp      [_mpresent],1
  300.         jne      @@Postfix
  301.         mov      ax,000ch
  302.         xor      cx,cx
  303.         mov      es,cx
  304.         xor      dx,dx
  305.         int      33h
  306.  
  307. @@Postfix:
  308.         pop      si
  309.         pop      di
  310.         pop      ds
  311.         pop      bp
  312.         ret
  313. _MouseUnInit endp
  314.  
  315.  
  316.  
  317.  
  318. ;----------------------------------------------------------------------------
  319. ; void MouseShowCursor(void);
  320.  
  321.        Public _MouseShowCursor
  322. _MouseShowCursor proc
  323.  
  324.         mov      ax,@data
  325.         mov      ds,ax
  326.  
  327.         xor      ax,ax
  328.         mov      [inter_ok],ax
  329.  
  330.         cmp      [MouseVisible],0
  331.         je       @@NotTheEnd
  332.         jmp      @@End
  333.  
  334. @@NotTheEnd:
  335.  
  336.        ; Prefix
  337.         push     bp
  338.         mov      bp,sp
  339.         push     ds
  340.         push     di
  341.         push     si
  342.  
  343. ; cld
  344.  
  345. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  346. ; mov  dx,GC_INDEX                 ;
  347. ; mov  ax,00000h+BIT_MASK          ;
  348. ; out  dx,ax                       ;
  349. ;                                  ;
  350. ; mov  dx,SC_INDEX                 ;
  351. ; mov  ax,0ff00h + MAP_MASK        ;
  352. ; out  dx,ax                       ;
  353. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  354.  
  355. ;
  356. ; mov  dx,GC_INDEX
  357. ; mov  al,BIT_MASK
  358. ; out  dx,al
  359. ; inc  dx
  360. ; in   al,dx
  361. ; mov  [savedbitmask],al
  362. ; xor  ax,ax
  363. ; out  dx,al
  364. ;
  365. ;
  366. ; mov  dx,SC_INDEX
  367. ; mov  al,MAP_MASK
  368. ; out  dx,al
  369. ; inc  dx
  370. ; in   al,dx
  371. ; mov  [savedmapmask],al
  372. ; mov  al,0ffh
  373. ; out  dx,al
  374.  
  375.  
  376. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  377.  
  378.  
  379. ; mov  ax,0A000h
  380. ; mov  es,ax
  381.  
  382. ; mov  ax,0003h
  383. ; int  33h
  384.  
  385. ;Save current background 3 bytes x 8 rows
  386. ;
  387. ; Now we need a save buffer pointer and a new mouse position pointer, thus
  388. ;  we need the x and y coordinates as well.
  389.  
  390.  ;cx = horizontal pos
  391.  ;dx = vertical pos
  392.  
  393.  
  394. ; push cx
  395. ;
  396. ; mov  ax,SCREEN_WIDTH              ;
  397. ; mov  [_mousey],dx                 ; put vertical position in mousey
  398. ; mov  bx,dx                        ;
  399. ;                   ;
  400. ; mov  cx,8                         ; cx = default lines to save
  401. ; mov  dx,cx                        ; dx = 8
  402. ; add  dx,bx                        ;        + vpos
  403. ; sub  dx,[MVHot]                   ;               - vhot
  404. ; cmp  dx,240                       ; dx must = vpos + 8 - vhot
  405. ; jle  @@Bottom_Not_Clipped         ;
  406. ; mov  cx,240                       ;
  407. ; sub  cx,bx                        ;
  408. ; add  cx,[MVHot]                   ; cx is set here to the number of lines saved at the bottom of the screen
  409. ;@@Bottom_Not_Clipped:              ;
  410. ; mov  [_Mouse_Bottom],cx             ; move to _Mouse_Bottom the number of lines to save on the bottom
  411. ; mov  cx,8                         ;
  412. ; sub  bx,[MVHot]                   ; bx is still vpos
  413. ; js   @@Above_The_Top              ;
  414. ; jmp  SHORT @@Not_Above_The_Top    ;
  415. ;@@Above_The_Top:                   ;
  416. ; add  cx,[_mousey]                 ;
  417. ; sub  cx,[MVHot]                   ;
  418. ; xor  bx,bx                        ;
  419. ;@@Not_Above_The_Top:               ;
  420. ; mul  bx                           ;
  421. ; mov  [top_clip],cx                ;
  422. ; pop  si                           ; move horizontal pos to si
  423. ; mov  [_mousex],si                 ;
  424. ; mov  dx,3                         ;
  425. ; sub  si,[MHHot]                   ;
  426. ; js   @@Off_The_Left               ;
  427. ; jmp  SHORT @@Not_Off_The_Left     ;
  428. ;@@Off_The_Left:                    ;
  429. ; xor  si,si                        ;
  430. ; mov  cx,[MHHot]                   ;
  431. ; sub  cx,[_mousex]                 ;
  432. ; shr  cx,1                         ;
  433. ; shr  cx,1                         ;
  434. ; inc  cx                           ;
  435. ; sub  dx,cx
  436. ;@@Not_Off_The_Left:
  437. ; mov  [_Mouse_Left],dx    ; _Mouse_Left is equal to the number of bytes needed
  438. ; shr  si,1
  439. ; shr  si,1
  440. ; mov  bx,80   ; save the number of bytes we can write at the right edge of
  441. ; sub  bx,si   ;  the screen to account for clipping.
  442. ; mov  bh,bl   ;  save it in bh.
  443. ; add  si,ax
  444. ; add  si,[_MousePage_Offset]
  445. ; mov  [oldinfopos],si
  446. ;
  447. ; mov  di,MOUSE_SAVE_BUFFER
  448. ;
  449. ; mov  bx,[top_clip]
  450. ; cmp  bx,[_Mouse_Bottom]
  451. ; jle  @@Mouse_Row_Loop_Save
  452. ; mov  bx,[_Mouse_Bottom]
  453. ;@@Mouse_Row_Loop_Save:
  454. ; mov  cx,[_Mouse_Left]
  455. ; rep  movs BYTE PTR es:[di],BYTE PTR es:[si]
  456. ; add  si,80
  457. ; sub  si,[_Mouse_Left]
  458. ; dec  bx
  459. ; jnz  @@Mouse_Row_Loop_Save
  460.  
  461.         inc      [MouseVisible]
  462.  
  463. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  464.  
  465. ; mov  dx,GC_INDEX
  466. ; mov  al,BIT_MASK
  467. ; mov  ah,[savedbitmask]
  468. ; out  dx,ax
  469. ;
  470. ; mov  dx,SC_INDEX
  471. ; mov  al,MAP_MASK
  472. ; mov  ah,[savedmapmask]
  473. ; out  dx,ax
  474.  
  475. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  476.  
  477.         mov      ax,2
  478.         mov      [inter_ok],ax
  479.         mov      ax,0003h
  480.         int      33h
  481.         xor      ax,ax
  482. ; mov  cx,[_mousex]
  483. ; mov  dx,[_mousey]
  484.  
  485.         call far ptr _MouseCursorDisplay
  486.  
  487.         mov      ax,1
  488.         mov      [inter_ok],ax
  489.  
  490. @@Postfix:
  491.         pop      si
  492.         pop      di
  493.         pop      ds
  494.         mov      sp,bp
  495.         pop      bp
  496. @@End:
  497.         ret
  498. _MouseShowCursor endp
  499.  
  500.  
  501.  
  502. ;----------------------------------------------------------------------------
  503. ; void MouseHideCursor(void);
  504. ;
  505.        Public _MouseHideCursor
  506. _MouseHideCursor proc
  507.  
  508.         mov      ax,@data
  509.         mov      ds,ax
  510.  
  511.         xor      ax,ax
  512.         mov      [inter_ok],ax
  513.  
  514.         cmp      [MouseVisible],0
  515.         je       @@End
  516.  
  517. ; Prefix
  518.         push     bp
  519.         mov      bp,sp
  520.         push     ds
  521.         push     di
  522.         push     si
  523.  
  524.         cld
  525.         dec  [MouseVisible]
  526.  
  527. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  528. ; mov  dx,GC_INDEX                 ;
  529. ; mov  ax,00000h+BIT_MASK          ;
  530. ; out  dx,ax                       ;
  531. ;                                  ;
  532. ;                                  ;
  533. ; mov  dx,SC_INDEX                 ;
  534. ; mov  ax,0ff00h + MAP_MASK        ;
  535. ; out  dx,ax                       ;
  536. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  537.  
  538.  
  539.         mov      dx,GC_INDEX
  540.         mov      al,BIT_MASK
  541.         out      dx,al
  542.         inc      dx
  543.         in       al,dx
  544.         mov      [savedbitmask],al
  545.         xor      ax,ax
  546.         out      dx,al
  547.  
  548.  
  549.         mov      dx,SC_INDEX
  550.         mov      al,MAP_MASK
  551.         out      dx,al
  552.         inc      dx
  553.         in       al,dx
  554.         mov      [savedmapmask],al
  555.         mov      al,0ffh
  556.         out      dx,al
  557.  
  558.  
  559. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  560.  
  561.  
  562. ;Restore old background 3 bytes x 8 rows
  563. ;
  564. ; We need a pointer to the save buffer and a pointer to the current mouse
  565. ;  position.
  566.  
  567.         mov      di,[oldinfopos]
  568.  
  569.         mov     ax,0A000h
  570.         mov      es,ax
  571.  
  572.         mov     si,MOUSE_SAVE_BUFFER
  573.  
  574.         mov      bx,[_Mouse_Top]
  575.         cmp      bx,[_Mouse_Bottom]
  576.         jl       @@Mouse_Row_Loop_Restore
  577.         mov      bx,[_Mouse_Bottom]
  578. @@Mouse_Row_Loop_Restore:
  579.         mov      cx,[_Mouse_Left]
  580.         rep      movs BYTE PTR es:[di],BYTE PTR es:[si]
  581.         add      di,_Virtual_Width_Addr
  582.         sub      di,[_Mouse_Left]
  583.         dec      bx
  584.         jnz      @@Mouse_Row_Loop_Restore
  585.  
  586. ; mov  dx,GC_INDEX
  587. ; mov  ax,0ff00h+BIT_MASK
  588. ; out  dx,ax
  589.  
  590. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  591.  
  592.         mov      dx,GC_INDEX
  593.         mov      al,BIT_MASK
  594.         mov      ah,[savedbitmask]
  595.         out      dx,ax
  596.  
  597.         mov      dx,SC_INDEX
  598.         mov      al,MAP_MASK
  599.         mov      ah,[savedmapmask]
  600.         out      dx,ax
  601.  
  602. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  603.  
  604.         mov  ax,1
  605.         mov  [inter_ok],ax
  606.  
  607.  
  608. @@Postfix:
  609.         pop  si
  610.         pop  di
  611.         pop  ds
  612.         mov  sp,bp
  613.         pop  bp
  614. @@End:
  615.         ret
  616. _MouseHideCursor endp
  617.  
  618.  
  619.  
  620.  
  621. ;----------------------------------------------------------------------------
  622. ; void MouseCursorDisplay(void);
  623. ;
  624.        Public _MouseCursorDisplay
  625. _MouseCursorDisplay proc
  626.  
  627.         cli
  628.         push     bp
  629.         mov      bp,sp
  630.         push     es
  631.         push     ds
  632.  
  633.         mov      bx,@data
  634.         mov      ds,bx
  635.         and      ax,00101010b
  636.         mov      [_mousekey],ax
  637.         cmp      [inter_ok],0
  638.         je       @@Get_Outta_Here
  639.         cmp      [MouseVisible],0
  640.         jne      @@Prefix
  641.  
  642. @@Get_Outta_Here:
  643.         pop      ds
  644.         pop      es
  645.         pop      bp
  646.         sti
  647.         ret           ; <==== Note that you have a return here too.
  648.  
  649. @@Prefix:
  650.         mov  [_MouseX],cx
  651.         mov  [_MouseY],dx
  652.  
  653. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  654. ; mov  dx,GC_INDEX                 ;
  655. ; mov  ax,00000h+BIT_MASK          ;
  656. ; out  dx,ax                       ;
  657. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  658.  
  659.  
  660.         mov      dx,GC_INDEX
  661.         mov      al,BIT_MASK
  662.         out      dx,al
  663.         inc      dx
  664.         in       al,dx
  665.         mov      [savedbitmask],al
  666.         xor      ax,ax
  667.         out      dx,al
  668.  
  669. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  670.  
  671.         mov      dx,SC_INDEX
  672.         mov      al,MAP_MASK
  673.         out      dx,al
  674.         inc      dx
  675.         in       al,dx
  676.         mov      [savedmapmask],al
  677.         mov      al,0ffh
  678.         out      dx,al
  679.  
  680.  
  681.  
  682. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  683.  
  684.         cld
  685.  
  686. ;Restore old background 3 bytes x 8 rows
  687. ;
  688. ; We need a pointer to the save buffer and a pointer to the current mouse
  689. ;  position.
  690.  
  691.         mov      ax,0A000h
  692.         mov      es,ax
  693.         cmp      [inter_ok],2
  694.         je       @@Save_Da_Background
  695.         mov      di,[oldinfopos]
  696.         mov      si,MOUSE_SAVE_BUFFER
  697.  
  698.         mov      bx,[_Mouse_Top]
  699.         cmp      bx,[_Mouse_Bottom]
  700.         jl       @@Mouse_Row_Loop_Restore
  701.         mov      bx,[_Mouse_Bottom]
  702. @@Mouse_Row_Loop_Restore:
  703.         mov      cx,[_Mouse_Left]
  704.         rep      movs BYTE PTR es:[di],BYTE PTR es:[si]
  705.         add      di,_Virtual_Width_Addr
  706.         sub      di,[_Mouse_Left]
  707.         dec      bx
  708.         jnz      @@Mouse_Row_Loop_Restore
  709.  
  710. ;Save current background 3 bytes x 8 rows
  711. ;
  712. ; Now we need a save buffer pointer and a new mouse position pointer, thus
  713. ;  we need the x and y coordinates as well.
  714.  
  715. @@Save_Da_Background:
  716.         mov      ax,_Virtual_Width_Pix
  717.         mov      bx,[_mousey]
  718.         mov      cx,8
  719.         mov      dx,cx
  720.         add      dx,bx
  721.         sub      dx,[MVHot]
  722.         cmp      dx,_Virtual_Width_Pix
  723.         jle      @@Bottom_Not_Clipped
  724.         mov      cx,_Virtual_Width_Pix
  725.         sub      cx,bx
  726.         add      cx,[MVHot]
  727. @@Bottom_Not_Clipped:
  728.         mov      [_Mouse_Bottom],cx
  729.         mov      cx,8
  730.         sub      bx,[MVHot]
  731.         js       @@Above_The_Top
  732.         jmp      SHORT @@Not_Above_The_Top
  733. @@Above_The_Top:
  734.         add      cx,[_mousey]
  735.         sub      cx,[MVHot]
  736.         xor      bx,bx
  737. @@Not_Above_The_Top:
  738.         mul      bx
  739.         mov      [_Mouse_Top],cx
  740.         mov      si,[_mousex]
  741.         mov      dx,3
  742.         sub      si,[MHHot]
  743.         js       @@Off_The_Left
  744.         jmp      SHORT @@Not_Off_The_Left
  745. @@Off_The_Left:
  746.         xor      si,si
  747.         mov      cx,[MHHot]
  748.         sub      cx,[_mousex]
  749.         shr      cx,1
  750.         shr      cx,1
  751.         inc      cx
  752.         sub      dx,cx
  753. @@Not_Off_The_Left:
  754.         mov      [_Mouse_Left],dx    ; _Mouse_Left is equal to the number of bytes needed
  755.         shr      si,1
  756.         shr      si,1
  757.         mov      bx,_Virtual_Width_Addr   ; save the number of bytes we can write at the right edge of
  758.         sub      bx,si   ;  the screen to account for clipping.
  759.         mov      bh,bl   ;  save it in bh.
  760.         add      si,ax
  761.         add      si,[_MousePage_Offset]
  762.         mov      [oldinfopos],si
  763.  
  764.         mov      dx,si   ; save the x,y position in order to draw the cursor
  765.  
  766.         mov      di,MOUSE_SAVE_BUFFER
  767.  
  768.         mov      ax,[_Mouse_Top]
  769.         cmp      ax,[_Mouse_Bottom]
  770.         jle      @@Mouse_Row_Loop_Save
  771.         mov      ax,[_Mouse_Bottom]
  772. @@Mouse_Row_Loop_Save:
  773.         mov      cx,[_Mouse_Left]
  774.         rep      movs BYTE PTR es:[di],BYTE PTR es:[si]
  775.         add      si,_Virtual_Width_Addr
  776.         sub      si,[_Mouse_Left]
  777.         dec      ax
  778.         jnz      @@Mouse_Row_Loop_Save
  779.  
  780.        ;Draw that mouse cursor!
  781.        ;
  782.        ; Ah, here's where it gets good.  We need the x,y coordinates, a pointer to
  783.        ;  the mouse color info, and a pointer to the mask info.
  784.  
  785.         mov      bp,[MMaskPtr]               ; ax = mask manipulation
  786.         add      bp,8                        ; bx = bl = loop counter. bh = right edge bytes
  787.         mov      cx,[_Mouse_Top]          ; cx = cl = shift counter ch = save shift.
  788.         sub      bp,cx
  789.         cmp      cx,[_Mouse_Bottom]
  790.         jl       @@No_Bottom_Clipping_Here
  791.         mov      cx,[_Mouse_Bottom]
  792. @@No_Bottom_Clipping_Here:
  793.         mov      bl,cl     ; set up the number of lines to draw according to _Mouse_Top.
  794.  
  795.                          ; dx = needed for out instructions.
  796.                          ; di \__ Copy from display mem to display mem.
  797.         mov     di,dx                       ; si /
  798.         mov     si,MOUSE_SAVE_BUFFER - 4    ; bp = mask offset pointer.
  799.                          ; es = Display mem segment register
  800.                          ; ds = Mask display segment register.
  801.                          ;       Always points to data segment?
  802.         mov      dx,SC_INDEX                 ;         Yup.  Now it does.
  803.         mov      al,MAP_MASK                 ;
  804.         out      dx,al                       ;
  805.         inc      dx
  806.  
  807.         mov      cx,[_mousex]
  808.         add      cx,8
  809.         sub      cx,[MHHot]
  810.         and      cx,00000011b
  811.         mov      ch,cl
  812.  
  813. @@Draw_Cursor_Loop:
  814.         mov      cl,ch
  815.         mov      al,ds:[bp]
  816.         inc      bp
  817.         xor      ah,ah
  818.         shl      ax,cl
  819.  
  820.  
  821.         cmp      [_Mouse_Left],3
  822.         jne      @@Continue_1
  823.         out      dx,al
  824.         movs     BYTE PTR es:[di],BYTE PTR es:[si]
  825.         dec      si
  826.         cmp      bh,1
  827.         jne      @@Continue_1
  828.         add      di,79                      ;*******************
  829.         jmp        SHORT @@Skip_Here_For_Clipping_Right
  830. @@Continue_1:
  831.         mov      cl,4
  832.         shr      ax,cl
  833.         cmp      [_Mouse_Left],2
  834.         jl       @@Continue_2
  835.         out      dx,al
  836.         movs     BYTE PTR es:[di],BYTE PTR es:[si]
  837.         dec      si
  838.         cmp      bh,2
  839.         jne      @@Continue_2
  840.         add      di,78                    ;*******************
  841.         jmp     SHORT @@Skip_Here_For_Clipping_Right
  842. @@Continue_2:
  843.         mov      cl,4
  844.         shr      ax,cl
  845.         out      dx,al
  846.         movs     BYTE PTR es:[di],BYTE PTR es:[si]
  847.         dec      si
  848.         add      di,_Virtual_Width_Addr
  849.         sub      di,[_Mouse_Left]
  850.  
  851. @@Skip_Here_For_Clipping_Right:
  852.         dec      bl
  853.         jnz      @@Draw_Cursor_Loop
  854.         mov      al,0fh
  855.         out      dx,al
  856.  
  857.        ; mov  dx,GC_INDEX
  858.        ; mov  ax,0ff00h+BIT_MASK
  859.        ; out  dx,ax
  860.  
  861.        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  862.  
  863.         mov      dx,GC_INDEX
  864.         mov      al,BIT_MASK
  865.         mov      ah,[savedbitmask]
  866.         out      dx,ax
  867.  
  868.         mov      dx,SC_INDEX
  869.         mov      al,MAP_MASK
  870.         mov      ah,[savedmapmask]
  871.         out      dx,ax
  872.  
  873.        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  874.  
  875. @@Postfix:
  876.         pop      ds
  877.         pop      es
  878.         pop      bp
  879.         sti
  880.         ret
  881. _MouseCursorDisplay endp
  882.  
  883.  
  884.  
  885.  
  886. ;----------------------------------------------------------------------------
  887. ; void MouseDelay(void);
  888. ;
  889.  
  890. difference     DW   0
  891.  
  892. _MouseDelay proc
  893.         Prefix
  894.         mov  [cs:difference],THE_DELAY
  895.         push es
  896.         mov  ax,0040h
  897.         mov  es,ax
  898.         mov  di,006Ch
  899.         mov  ax,[word ptr es:di]
  900. @@Da_Loop:
  901.         mov  dx,[word ptr es:di]
  902.         sub  dx,ax
  903.         cmp  dx,[cs:difference]               ; Mouse Delay
  904.         jl   @@Da_Loop
  905.         pop  es
  906.         Postfix
  907. _MouseDelay endp
  908.  
  909.  
  910.  
  911. ;----------------------------------------------------------------------------
  912. ; void SetMousePos(int x, int y);
  913.  
  914.     public _SetMousePos
  915. _SetMousePos proc
  916. ARG  x:word, y:word
  917.         Prefix
  918.  
  919.         mov      ax,0004h
  920.         mov      cx,[x]
  921.         mov      dx,[y]
  922.         int      33h
  923.         Postfix
  924. _SetMousePos endp
  925.  
  926.  
  927.  
  928. ;----------------------------------------------------------------------------
  929. ; void SetMousePort(void);
  930. ;
  931.     public  _SetMousePort
  932. _SetMousePort proc
  933. ARG  x1:word, y1:word, x2:word, y2:word
  934.  
  935.         Prefix
  936.         mov      ax,0007h
  937.         mov      cx,x1
  938.         cmp      cx,0
  939.         jge      @@x1_ok
  940.         xor      cx,cx
  941. @@x1_ok:
  942.         mov      dx,x2
  943.         cmp      dx,_Virtual_Width_Pix
  944.         jle      @@x2_ok
  945.         mov      dx,_Virtual_Width_Pix
  946. @@x2_ok:
  947.         int      33h
  948.         mov      ax,0008h
  949.         mov      cx,y1
  950.         cmp      cx,0
  951.         jge      @@y1_ok
  952.         xor      cx,cx
  953. @@y1_ok:
  954.         mov      dx,y2
  955.         cmp      dx,_Virtual_Height_Pix
  956.         jle      @@y2_ok
  957.         mov      dx,_Virtual_Height_Pix
  958. @@y2_ok:
  959.         int      33h
  960.         Postfix
  961. _SetMousePort endp
  962.  
  963.  
  964.  
  965.  
  966. ;----------------------------------------------------------------------------
  967. ; void MouseNonePressed(void);
  968. ;
  969.     public _MouseNonePressed
  970. _MouseNonePressed proc
  971.         Prefix
  972.         cmp      _MKP,0
  973.         je       @@First_Jump
  974.         call     _mousedelay
  975.  
  976. @@First_Jump:
  977.         xor      ax,ax
  978.         mov      [_MKP],ax
  979.         cmp      [_mousekey],0
  980.         jne      @@NOT
  981.         mov      ax,1
  982.         mov      _MKP,ax
  983.         jmp      SHORT @@DaEnd
  984. @@NOT:
  985.         mov      ax,0
  986. @@DaEnd:
  987.         Postfix
  988. _MouseNonePressed endp
  989.  
  990.  
  991.  
  992.  
  993. ;----------------------------------------------------------------------------
  994. ; void _MouseLeftPressed(void);
  995. ;
  996.     public _MouseLeftPressed
  997. _MouseLeftPressed proc
  998.         Prefix
  999.         cmp      _MKP,0
  1000.         je       @@First_Jump
  1001.         call     _MouseDelay
  1002.  
  1003. @@First_Jump:
  1004.         xor      ax,ax
  1005.         mov      [_MKP],ax
  1006.         cmp      [_mousekey],2
  1007.         jne      @@NOT
  1008.         mov      ax,1
  1009.         mov      _MKP,ax
  1010.         jmp      SHORT @@DaEnd
  1011. @@NOT:
  1012.         mov      ax,0
  1013. @@DaEnd:
  1014.         Postfix
  1015. _MouseLeftPressed endp
  1016.  
  1017.  
  1018.  
  1019. ;----------------------------------------------------------------------------
  1020. ; void MouseRightPressed(void);
  1021. ;
  1022.     public _MouseRightPressed
  1023. _MouseRightPressed proc
  1024.  
  1025.         Prefix
  1026.         cmp      _MKP,0
  1027.         je       @@First_Jump
  1028.         call     _mousedelay
  1029.  
  1030. @@First_Jump:
  1031.         xor      ax,ax
  1032.         mov      [_MKP],ax
  1033.         cmp      [_mousekey],8
  1034.         jne      @@NOT
  1035.         mov      ax,1
  1036.         mov      _MKP,ax
  1037.         jmp      SHORT @@DaEnd
  1038. @@NOT:
  1039.         mov  ax,0
  1040. @@DaEnd:
  1041.         Postfix
  1042. _MouseRightPressed endp
  1043.  
  1044.  
  1045.  
  1046. ;----------------------------------------------------------------------------
  1047. ; void MouseBothPressed(void);
  1048. ;
  1049.     public _MouseBothPressed
  1050. _MouseBothPressed proc
  1051.         Prefix
  1052.  
  1053.         cmp      _MKP,0
  1054.         je       @@First_Jump
  1055.         call     _mousedelay
  1056.  
  1057. @@First_Jump:
  1058.         xor      ax,ax
  1059.         mov      [_MKP],ax
  1060.         cmp      [_mousekey],10
  1061.         jne      @@NOT
  1062.         mov      ax,1
  1063.         mov      _MKP,ax
  1064.         jmp      SHORT @@DaEnd
  1065. @@NOT:
  1066.         mov  ax,0
  1067. @@DaEnd:
  1068.         Postfix
  1069. _MouseBothPressed endp
  1070.  
  1071.  
  1072.  
  1073. ;----------------------------------------------------------------------------
  1074. ; void MouseCenterPressed(void);
  1075. ;
  1076.     public _MouseCenterPressed
  1077. _MouseCenterPressed proc
  1078.  
  1079.         Prefix
  1080.         cmp      _MKP,0
  1081.         je       @@First_Jump
  1082.         call     _mousedelay
  1083.  
  1084. @@First_Jump:
  1085.         xor      ax,ax
  1086.         mov      [_MKP],ax
  1087.         cmp      [_mousekey],32
  1088.         jne      @@NOT
  1089.         mov      ax,1
  1090.         mov      _MKP,ax
  1091.         jmp      SHORT @@DaEnd
  1092. @@NOT:
  1093.         mov  ax,0
  1094. @@DaEnd:
  1095.         Postfix
  1096. _MouseCenterPressed endp
  1097.  
  1098.  
  1099. ;----------------------------------------------------------------------------
  1100. ; void MouseCenterLeftPressed(void);
  1101.  
  1102.     public _MouseCenterLeftPressed
  1103. _MouseCenterLeftPressed proc
  1104.  
  1105.         Prefix
  1106.  
  1107.         cmp      _MKP,0
  1108.         je       @@First_Jump
  1109.         call     _mousedelay
  1110.  
  1111. @@First_Jump:
  1112.         xor      ax,ax
  1113.         mov      [_MKP],ax
  1114.         cmp      [_mousekey],34
  1115.         jne      @@NOT
  1116.         mov      ax,1
  1117.         mov      _MKP,ax
  1118.         jmp      SHORT @@DaEnd
  1119. @@NOT:
  1120.         mov  ax,0
  1121. @@DaEnd:
  1122.         Postfix
  1123. _MouseCenterLeftPressed endp
  1124.  
  1125.  
  1126.  
  1127. ;----------------------------------------------------------------------------
  1128. ; int MouseCenterRightPressed(void);
  1129. ;
  1130.     public _MouseCenterRightPressed
  1131. _MouseCenterRightPressed proc
  1132.         Prefix
  1133.  
  1134.         cmp      _MKP,0
  1135.         je       @@First_Jump
  1136.         call     _mousedelay
  1137.  
  1138. @@First_Jump:
  1139.         xor      ax,ax
  1140.         mov      [_MKP],ax
  1141.         cmp      [_mousekey],40
  1142.         jne      @@NOT
  1143.         mov      ax,1
  1144.         mov      _MKP,ax
  1145.         jmp      SHORT @@DaEnd
  1146. @@NOT:
  1147.         mov      ax,0
  1148. @@DaEnd:
  1149.         Postfix
  1150. _MouseCenterRightPressed endp
  1151.  
  1152.  
  1153. ;----------------------------------------------------------------------------
  1154. ; int MouseAllPressed(void);
  1155.  
  1156.     public _MouseAllPressed
  1157. _MouseAllPressed proc
  1158.  
  1159.         Prefix
  1160.         cmp      _MKP,0
  1161.         je       @@First_Jump
  1162.         call     _mousedelay
  1163.  
  1164. @@First_Jump:
  1165.         xor      ax,ax
  1166.         mov      [_MKP],ax
  1167.         cmp      [_mousekey],42
  1168.         jne      @@NOT
  1169.         mov      ax,1
  1170.         mov      _MKP,ax
  1171.         jmp      SHORT @@DaEnd
  1172. @@NOT:
  1173.         mov      ax,0
  1174. @@DaEnd:
  1175.         Postfix
  1176. _MouseAllPressed endp
  1177.  
  1178.  
  1179.  
  1180. ;----------------------------------------------------------------------------
  1181. ; void MouseSetCursorShape(void);
  1182.  
  1183.      Public _MouseSetCursorShape
  1184. _MouseSetCursorShape proc
  1185. ARG  curstype:word
  1186. ;Prefix
  1187.         push     bp
  1188.         mov      bp,sp
  1189.         push     ds
  1190.         push     di
  1191.         push     si
  1192.  
  1193.         mov      ax,@data
  1194.         mov      ds,ax
  1195.  
  1196.         call     far ptr _MouseHideCursor
  1197.  
  1198.         mov      ax,[curstype]
  1199.         mov      dx,10
  1200.         mul      dx
  1201.         mov      bx,OFFSET StandardCurs
  1202.         add      ax,bx
  1203.         mov      di,ax
  1204.  
  1205.         mov      si,OFFSET MMaskPtr
  1206.         mov      ds:[si],ax
  1207.         mov      ax,SEG StandardCurs
  1208.         mov      es,ax
  1209.  
  1210.         add      di,8
  1211.         mov      al,es:[di]
  1212.         xor      ah,ah
  1213.         mov      [MHHot],ax
  1214.         inc      di
  1215.         mov      al,es:[di]
  1216.         mov      [MVHot],ax
  1217.  
  1218.         call     far ptr _MouseShowCursor
  1219.  
  1220.  
  1221.         mov      ax,01h
  1222.         mov      cx,[_mousex]
  1223.         mov      dx,[_mousey]
  1224.         call     far ptr _MouseCursorDisplay
  1225.  
  1226.        ;Postfix
  1227.         pop      si
  1228.         pop      di
  1229.         pop      ds
  1230.         pop      bp
  1231.         ret
  1232. _MouseSetCursorShape endp
  1233.  
  1234.  
  1235.  
  1236. ;----------------------------------------------------------------------------
  1237. ; void MouseSetPage(VRAM_PTR mpageoffset);
  1238.  
  1239.     Public _MouseSetPage
  1240. _MouseSetPage proc far
  1241. ARG  mpageoffset:word
  1242.         push     bp
  1243.         mov      bp,sp
  1244.         push     ds
  1245.  
  1246.         mov      ax,@data
  1247.         mov      ds,ax
  1248.  
  1249.         mov      ax,[mpageoffset]
  1250.         mov      [_MousePage_Offset],ax
  1251.  
  1252.         pop      ds
  1253.         pop      bp
  1254.         ret
  1255. _MouseSetPage endp
  1256.  
  1257. ;----------------------------------------------------------------------------
  1258.  
  1259.  db "Mike Duffy's Xmouse Library. Version 1.2 Copyright 1992 Mike Duffy."
  1260.  
  1261. ;----------------------------------------------------------------------------
  1262. End
  1263.